<?
    /**
     * PrincipioLab
     *
     * @package    PrincipioLab
     */

    /**
     * PrincipioLab_Messages
     *
     * @package    PrincipioLab
     */
    class PrincipioLab_Messages
    {
        /**
         * Ошибка уровня работы приложения.
         */
        const ERROR_ALERT = Zend_Log::ALERT;

        /**
         * Ошибка уровня результатов работы приложения.
         */
        const ERROR_ERR = Zend_Log::ERR;

        /**
         * Ошибка уровня результатов работы приложения.
         */
        const ERROR_INFO = Zend_Log::INFO;

        /**
         * Ошибка, отсутствие валидной сессии.
         */
        const ERROR_NEED_LOGIN = -1;

        /**
         * @var int Параметр типа ошибки.
         */
        public static $error_type;

        /**
         * @var string[] Массив с сообщениями об ошибке.
         */
        public static $error_list = array();

        /**
         * @var bool Флаг наличия ошибки.
         */
        public static $is_error = false;

        /**
         * @var string[] Массив с предупреждениями.
         */
        public static $warning_list = array();

        /**
         * @var bool Флаг наличия варнинга.
         */
        public static $is_warning = false;

        /**
         * @var string[] Массив с сообщениями.
         */
        public static $message_list = array();

        /**
         * @var bool Флаг наличия сообщения.
         */
        public static $is_message = false;


        /**
         * Помещаем предупреждение в список предупреждений $warning_list.
         *
         * @param string $warning
         * @return void
         */
        public static function warning($warning)
        {
            self::$is_warning = true;
            self::$warning_list[] = self::processingString($warning);
        }


        /**
         * Помещаем сообщение в список сообщений $message_list.
         *
         * @param string $message
         * @return void
         */
        public static function message($message)
        {
            self::$is_message = true;
            self::$message_list[] = self::processingString($message);
        }


        /**
         * Помещаем ошибку в список ошибок $error_list, задаём значение параметров наличия и типа ошибки.
         *
         * @param int $error
         * @param int $type
         * @return bool
         */
        public static function error($error, $type = self::ERROR_ERR)
        {
            self::$is_error = true;
            self::$error_list[] = self::processingString($error);
            self::errorType($type);

            return false;
        }


        /**
         * Обрабатываем строку для корректного отображения в браузере.
         *
         * @param string $string Строка для обработки.
         * @return string
         */
        private static function processingString($string)
        {
            return str_replace("\n", "<br/>", htmlspecialchars($string, ENT_QUOTES));
        }


        /**
         * Задаём параметр типа ошибки.
         *
         * @param int $type
         */
        public static function errorType($type)
        {
            if (self::$error_type < $type)
                self::$error_type = $type;
        }


        /**
         *
         * @return bool
         */
        public static function has()
        {
            return (self::$is_error || self::$is_message || self::$is_warning);
        }


        /**
         * 1) Заполняем массив $data соответствующими параметрами ошибки и обработанными сообщениями.
         * 2) Возвращаем массив с сообщениями (используем для ответа к AJAX запросу).
         *
         * @return string[][]
         */
        public static function toArray()
        {
            $data['is_error'] = self::$is_error;
            $data['error_type'] = self::$error_type;

            $data['errors'] = self::$error_list;

            $data['messages'] = self::$message_list;

            $data['warnings'] = self::$warning_list;

            return $data;
        }
    }
?>